iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0

DeepStream已經做好了編/解碼的元件nvvl42decoder、nvv4l2h264enc、nvv4l2h265enc,只要元件順序接對就能輕鬆使用硬體資源。今天要探討更深入的影片編碼知識,當遇到實際問題時,這些知識也許就是你的救星。

影片解碼

我們在Day 05的時候已經有示範過怎麼透過nvv4l2decoder解碼影片,但那時候是解碼範例影片,我們現在進一步釐清解碼的知識。

I幀(I-Frame)和P幀(P-Frame)

影片壓縮技術中會有數種影格類型,其中就包含I幀和P幀,一些常見的即時串流就是透過這兩種影格去解碼影片的,我們就假定壓縮格式只包含這兩種來介紹。

I幀又被視為關鍵幀,你可以把它視為一個完整壓縮的圖片,可以單獨還原出畫面;P幀則是只參考他的前一幀並把差異記錄下來。壓縮後的影片就是由一個I幀跟上數個P幀組成一個GOP(Group of Picture),這個參數通常可以在攝影機上設定。

GOP越高則P幀的數量越多,可以得到更好的壓縮率。但是!數值越高代表著你要收到越多影格才能解碼出一段影片,並且只有I幀是完整的畫面,如果太久沒有I幀做校正會導致影片模糊或產生殘影。

解碼破圖

這個是在即時串流很容易遇到的情況,我們接著了解破圖的原因。剛才提到I幀是參考用的關鍵幀,當失去I幀的時候,原本在後面的P幀沒有真正的參考畫面,解碼時畫面錯誤會隨P幀數量累加,導致看到最終破圖的片段。

nvv4l2decoder輸入輸出

輸入常用的就是H.264和H.265,但H.265有昂貴的專利費用問題,因此H.264還是大宗,來看一下gst-inspect-1.0的輸出

sink_pad
輸出的部分則非常寬鬆,因為帶有memory:NVMM這個特性,所以設計上在NVIDIA的掌控之中,所以可以看到並沒有明示只能使用哪些色彩格式。
src_pad

影像編碼

色彩格式調整

因為推論到OSD這幾個元件幾乎都只支援NV12和RGBA,但查一下nvv4l2h264enc會發現他沒有支援這兩種色彩的輸入

sink_pad
所以在元件前面記得接上nvvideoconvert把色彩過渡到可以支援的範圍。

輸出屬性調整

  • bitrate 數值越高可以保留越多細節,但會降低壓縮率,在即時串流應用要調整到適合的數值

  • idrinterval 發送IDR-Frame的間隔,IDR-Frame相較於I-Frame是真正的關鍵幀。在即時串流的情況下,數值越低可以讓接收端在更短的時間內開始解碼,同樣地也會影響壓縮率。

  • iframeinterval 發送I-Frame的間隔。數值越低,解碼時可以參考的畫面就越多,破圖的機會就更低,且畫面失真的比例也較低。

  • insert-sps-pps
    是否在每個IDR-Frame插入SPS和PPS,沒有這些資料接收端也不能解碼,所以即時串流時要設定為true

    SPS (Sequence Parameter Set): 序列參數集,記錄影片的解析度、Profile/Level、幀率等全域基礎設定。

    PPS (Picture Parameter Set): 圖像參數集,記錄熵編碼方式、切片(Slice)模式等解碼細節。

  • profile 不同輸出品質的設定,如果你不是影片編碼的專家,建議可以直接改profile去看輸出效果是否滿意

結語

通常預設的設定在編解碼檔案時不會有什麼太大的問題,往往問題都出現在即時串流,今天介紹的這些屬性也是我在踩過一次又一次的坑之後歸納出來的精華,當你也在嘗試輸出即時串流時不妨也調整看看吧,或許能幫上不少忙。


上一篇
[Day 14] GstBuffer和NvBufSurface
下一篇
[Day 16] 認識GLib
系列文
深入認識DeepStream,不只是停在執行範例 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言